Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 85074748979050525967755382f1ac0a9554530e


Parents : 0795d22
Author : Ivan <ivan@quad4.io>
Signature : Invalid signer <e46112d44649266d71fe2193e00a4710>, author is <ivan@quad4.io>
Date : 2026-07-05T01:22:30-05:00

feat(ci): add preview release workflow and update draft release notes for preview tags

Changes
Diff

diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml
index 1f0abb96..1d0e8e49 100644
--- a/.github/workflows/build-release.yml
+++ b/.github/workflows/build-release.yml
@@ -541,7 +541,7 @@ jobs:
provenance-name: meshchatx-android-flatpak-${{ github.ref_name }}.intoto.jsonl
draft-github-release:
- name: Draft GitHub release (all assets + SLSA)
+ name: ${{ startsWith(github.ref_name, 'preview-') && 'Preview GitHub release (all assets + SLSA)' || 'Draft GitHub release (all assets + SLSA)' }}
needs:
- linux-release
- collect-linux-slsa-subjects
@@ -693,7 +693,9 @@ jobs:
run: bash scripts/ci/github-draft-release-upload-assets.sh upload
- name: Upload release assets to Bunny Storage
- if: ${{ steps.release_track.outputs.track == 'master' || steps.release_track.outputs.track == 'dev' }}
+ if: >-
+ !startsWith(github.ref_name, 'preview-') &&
+ (steps.release_track.outputs.track == 'master' || steps.release_track.outputs.track == 'dev')
env:
BUNNY_STORAGE_ACCESS_KEY: ${{ secrets.BUNNY_STORAGE_ACCESS_KEY }}
BUNNY_STORAGE_BASE_URL: ${{ vars.BUNNY_STORAGE_BASE_URL }}

diff --git a/.github/workflows/preview-release.yml b/.github/workflows/preview-release.yml
new file mode 100644
index 00000000..43ca4cde
--- /dev/null
+++ b/.github/workflows/preview-release.yml
@@ -0,0 +1,88 @@
+# Weekly preview builds from master: push a preview-* tag when master has new
+# commits since the last prerelease, which triggers build-release.yml.
+#
+# Pinned first-party actions (bump tag and SHA together when upgrading):
+# actions/checkout@v6.0.1 8e8c483db84b4bee98b60c0593521ed34d9990e8
+#
+name: Preview Release
+
+on:
+ schedule:
+ - cron: "0 6 * * 0"
+ workflow_dispatch:
+
+concurrency:
+ group: preview-release
+ cancel-in-progress: false
+
+permissions:
+ contents: read
+
+jobs:
+ metadata:
+ name: Prepare preview tag
+ runs-on: ubuntu-latest
+ outputs:
+ tag_name: ${{ steps.meta.outputs.tag_name }}
+ commit_sha: ${{ steps.meta.outputs.commit_sha }}
+ skip_release: ${{ steps.meta.outputs.skip_release }}
+ steps:
+ - name: Checkout
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ with:
+ ref: master
+ fetch-depth: 0
+
+ - name: Compute preview tag
+ id: meta
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ set -euo pipefail
+ short_sha="$(git rev-parse --short=7 HEAD)"
+ full_sha="$(git rev-parse HEAD)"
+ tag="preview-$(date -u +%Y.%m.%d)-${short_sha}"
+
+ skip_release=false
+ if [ "${{ github.event_name }}" = "schedule" ]; then
+ last_preview_sha="$(gh release list --limit 50 --json tagName,isPrerelease,targetCommitish \
+ --jq '[.[] | select(.isPrerelease) | select(.tagName | startswith("preview-"))][0].targetCommitish // empty')"
+ if [ -n "${last_preview_sha}" ] && [ "${last_preview_sha}" = "${full_sha}" ]; then
+ echo "No new commits on master since last preview (${last_preview_sha}); skipping scheduled release."
+ skip_release=true
+ fi
+ fi
+
+ echo "tag_name=${tag}" >> "$GITHUB_OUTPUT"
+ echo "commit_sha=${full_sha}" >> "$GITHUB_OUTPUT"
+ echo "skip_release=${skip_release}" >> "$GITHUB_OUTPUT"
+ echo "Preview tag: ${tag} @ ${full_sha} (skip_release=${skip_release})"
+
+ tag:
+ name: Tag master and trigger build-release
+ needs: metadata
+ if: needs.metadata.outputs.skip_release != 'true'
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ steps:
+ - name: Checkout
+ uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
+ with:
+ ref: master
+ fetch-depth: 0
+
+ - name: Create and push preview tag
+ env:
+ TAG: ${{ needs.metadata.outputs.tag_name }}
+ SHA: ${{ needs.metadata.outputs.commit_sha }}
+ run: |
+ set -euo pipefail
+ if git rev-parse "refs/tags/${TAG}" >/dev/null 2>&1; then
+ echo "Tag ${TAG} already exists; skipping push."
+ exit 0
+ fi
+ git config user.name "github-actions[bot]"
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
+ git tag -a "${TAG}" -m "Weekly preview build for ${SHA}" "${SHA}"
+ git push origin "${TAG}"

diff --git a/scripts/ci/github-draft-release-upload-assets.sh b/scripts/ci/github-draft-release-upload-assets.sh
index a9fbdc72..822bcde7 100644
--- a/scripts/ci/github-draft-release-upload-assets.sh
+++ b/scripts/ci/github-draft-release-upload-assets.sh
@@ -86,8 +86,15 @@ done
mapfile -t files < <(find "$STAGE" -type f)
{
- echo "Automated draft release. Review assets and provenance before publishing."
- echo
+ if [[ "$TAG" == preview-* ]]; then
+ echo "**Preview release** — automated weekly snapshot from \`master\`. Not a stable release; use tagged production releases for daily use."
+ echo
+ echo "Commit: \`${GITHUB_SHA:-unknown}\`"
+ echo
+ else
+ echo "Automated draft release. Review assets and provenance before publishing."
+ echo
+ fi
echo "## SHA256 Checksums"
echo
echo "| Asset | SHA256 |"
@@ -106,9 +113,17 @@ mapfile -t files < <(find "$STAGE" -type f)
} > "$notes_file"
if ! gh release view "$TAG" >/dev/null 2>&1; then
- gh release create "$TAG" --draft --title "$TAG" --notes-file "$notes_file"
+ if [[ "$TAG" == preview-* ]]; then
+ gh release create "$TAG" --prerelease --title "$TAG" --notes-file "$notes_file"
+ else
+ gh release create "$TAG" --draft --title "$TAG" --notes-file "$notes_file"
+ fi
else
- gh release edit "$TAG" --notes-file "$notes_file"
+ if [[ "$TAG" == preview-* ]]; then
+ gh release edit "$TAG" --prerelease --title "$TAG" --notes-file "$notes_file"
+ else
+ gh release edit "$TAG" --notes-file "$notes_file"
+ fi
fi
for f in "${files[@]}"; do


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────